from django.shortcuts import render
from rest_framework import viewsets,mixins
from .models import Absent,AbsentType
from .serializers import AbsentSerializer,AbsentTypeSerializer
from rest_framework.response import Response
from rest_framework.views import APIView
from .uitls import get_responder
from apps.oaauth.serializers import UserSerializer

# class AbsentViewSet(viewsets.ModelViewSet):
#     pass

# 发起考勤
# 处理考勤
# 查看自己的考勤列表(list?who=my)
# 查看下属的考勤列表(list?who=sub)
class AbsentViewSet(mixins.CreateModelMixin,
                   mixins.UpdateModelMixin,
                   mixins.ListModelMixin,
                   viewsets.GenericViewSet):
    queryset = Absent.objects.all()
    serializer_class = AbsentSerializer

    # put方法
    def update(self, request, *args, **kwargs):
        # 默认情况下 如果要修改一条数据 那么要把这个数据序列化中的指定字段全部都上传
        # 如果想只修改一部分数据 那么可以在kwargs中设置partial为True
        kwargs['partial'] = True
        # 必须要调用父类中的update方法 不然这个update方法不会执行
        return super().update(request,*args,**kwargs)

    # 默认情况下 通过/absent/1获取的是所有请假列表
    # 而我们只想要查看自己考勤列表  或者是下属的考勤列表 我们需要重写list
    # get方法
    def list(self,request,*args,**kwargs):
        query_set = self.get_queryset()
        # 获取查询参数
        param = request.query_params.get('who')
        if param and param == 'sub':
            result = query_set.filter(responder=request.user)
        else:
            result = query_set.filter(requester=request.user)

        # 由于我们重写了list函数 所以之前内置完成分页的效果需要我们自己实现了
        # 把根据url筛选出来的符合要求的数据传入到paginate_queryset
        # paginate_queryset方法 会做分页的逻辑
        # page也是一个queryset对象
        page = self.paginate_queryset(result)
        # 如果DEFAULT_PAGINATION_CLASS 有设置的话 page就是None
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            # 这个除了会给你返回序列化的数据外 还会返回上一页的url 返回总数据条数
            return self.get_paginated_response(serializer.data)
        # 这里返回的result 都是query_set对象 里面存储这ORM模型
        # 我们需要对result序列化才能返回给前端
        serialize = self.serializer_class(result,many=True)
        return Response(data=serialize.data)

# 请假类型
class AbsentTypeView(APIView):
    def get(self,request):
        print('get')
        types = AbsentType.objects.all()
        serializer = AbsentTypeSerializer(types,many=True)
        print('types',types)
        print('serializer',serializer.data)
        return Response(data=serializer.data)

# 显示审批者
class ResponderView(APIView):
    def get(self,request):
        # 获取审批者  得到的是OAUser对象
        responder = get_responder(request)
        # 如果序列化的是一个null类型的数据 那么它将会返回一个除了主键外的所有字段都为空的字典
        serializer = UserSerializer(responder)
        return Response(data=serializer.data)
